/*
 * PruebaArchivoIndice.cpp
 *
 *  Created on: 04/06/2013
 *      Author: jonathan
 */

#include "PruebaArchivoIndice.h"
#include "../commons/InfoRepositorioActual.h"
#include "../general/estructuras/Documento.h"
#include "../general/estructuras/Termino.h"
#include "../indexado/archivos/ArchivoIndice.h"
#include "../commons/bitstream.h"
#include "../commons/ArchivoUtils.h"
#include <fstream>
void PruebaArchivoIndice::after() {

}
void PruebaArchivoIndice::before() {
	this->borrarArchivo("archivoPunterosInd");
	this->borrarArchivo("archivoFCInd");
	this->borrarArchivo("archIndice");
	this->borrarArchivo("archivoPunterosInd2");
	this->borrarArchivo("archivoFCInd2");
	this->borrarArchivo("archIndice2");
}

void PruebaArchivoIndice::run() {
	ResultadoTest resTotal("----------------TEST_ARCHIVO_INDICE------------------");
	resTotal.assertTrue(this->escribirEntradas().getResultado(), "Test1");
	resTotal.assertTrue(this->leerCabeceras().getResultado(), "Test2");
	resTotal.getResultado();
}

ResultadoTest PruebaArchivoIndice::escribirEntradas() {
	ResultadoTest res("escribirEntradas");
	InfoRepositorioActual::Instance()->setCantidadArchivos(3);
	Documento * doc1 = new Documento();
	doc1->setNumero(1);
	doc1->addPosicion(1);
	doc1->addPosicion(2);
	Documento * doc12 = new Documento();
	doc12->setNumero(1);
	doc12->addPosicion(1);
	doc12->addPosicion(2);

	Documento * doc2 = new Documento();
	doc2->setNumero(3);
	doc2->addPosicion(3);
	doc2->addPosicion(5);

	Documento * doc22 = new Documento();
	doc22->setNumero(3);
	doc22->addPosicion(3);
	doc22->addPosicion(5);

	Termino t1;
	t1.setCaracteres("barco");
	t1.addDocumento(doc1);
	t1.addDocumento(doc2);

	Termino t2;
	t2.setCaracteres("barcasa");
	t2.addDocumento(doc22);

	Termino t3;
	t3.setCaracteres("casa");
	t3.addDocumento(doc12);

	ArchivoIndice ind("archIndice", "archivoFCInd", "archivoPunterosInd", ios_base::out);
	ind.escribir(t1);
	ind.escribir(t2);
	ind.escribir(t3);
	ind.close();
	//Ahora levanto la info del indice ppal.
	BitStream bs("archIndice", ios_base::in);
	res.assertTrue(bs.get() == 0, "Mal escrita la cantidad de chars iguales");
	res.assertTrue(bs.get() == 5, "Mal escrita la cantidad de chars distintos");
	EnteroLargo nro = leerBinario(&bs, 32);
	res.assertTrue(nro == 0, "Mal escrita la posicion de lexico");

	res.assertTrue(bs.get() == 4, "Mal escrita la cantidad de chars iguales");
	res.assertTrue(bs.get() == 3, "Mal escrita la cantidad de chars distintos");

	res.assertTrue(bs.get() == 0, "Mal escrita la cantidad de chars iguales");
	res.assertTrue(bs.get() == 4, "Mal escrita la cantidad de chars distintos");

	return res;
}

ResultadoTest PruebaArchivoIndice::leerCabeceras() {
	ResultadoTest res("leerCabeceras");
	InfoRepositorioActual::Instance()->setTamanioBloqueFC(2);
	InfoRepositorioActual::Instance()->setCantidadArchivos(4);
	Termino * t1 = this->crearTermino("bar", 1, this->crearDocumento(3, 2, 3, 5));
	Termino * t2 = this->crearTermino("casa", 2, this->crearDocumento(1, 2, 1, 2), this->crearDocumento(3, 2, 3, 5));
	Termino * t3 = this->crearTermino("casita", 2, this->crearDocumento(1, 2, 1, 2), this->crearDocumento(3, 2, 3, 5));
	Termino * t4 = this->crearTermino("casota", 1, this->crearDocumento(3, 2, 3, 5));
	Termino * t5 = this->crearTermino("marta", 2, this->crearDocumento(1, 2, 1, 2), this->crearDocumento(3, 2, 3, 5));
	Termino * t6 = this->crearTermino("marto", 1, this->crearDocumento(3, 2, 3, 5));

	ArchivoIndice ind("archIndice2", "archivoFCInd2", "archivoPunterosInd2", ios_base::out);
	ind.escribir(*t1);
	ind.escribir(*t2);
	ind.escribir(*t3);
	ind.escribir(*t4);
	ind.escribir(*t5);
	ind.escribir(*t6);
	ind.close();

	ArchivoIndice ind2("archIndice2", "archivoFCInd2", "archivoPunterosInd2", ios_base::in);
	//leo las 3 cabeceras...

	Cabecera cabecera = ind2.leerCabeceraBloque(1);
	res.assertEquals("casita", cabecera.getTermino()->getCaracteres());
	Termino * term =cabecera.getTermino();
	delete (term);

	cabecera = ind2.leerCabeceraBloque(2);
	res.assertEquals("marta", cabecera.getTermino()->getCaracteres());
	delete (cabecera.getTermino());

	cabecera = ind2.leerCabeceraBloque(0);
	res.assertEquals("bar", cabecera.getTermino()->getCaracteres());
	delete (cabecera.getTermino());
	delete t1;
	delete t2;
	delete t3;
	delete t4;
	delete t5;
	delete t6;
	return res;
}

